home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / viewers / polyview / polyvw31.lha / Polyview3.1 / new / pvmain.c < prev    next >
C/C++ Source or Header  |  1993-08-24  |  15KB  |  492 lines

  1. /*****************************************************************************
  2.  * NCSA Polyview 3.1                                                         *
  3.  *                                                                           *
  4.  * Version 3.1 changes and additions by Gilles Bourhis.                      *
  5.  * Version 3 changes and additions by Marc Andreessen.                       *
  6.  * Version 2 by Brian Calvert.                                               *
  7.  *                                                                           *
  8.  * Software Development Group                                                *
  9.  * National Center for Supercomputing Applications                           *
  10.  * University of Illinois at Urbana-Champaign                                *
  11.  *                                                                           *
  12.  * This is BETA release software.  As such it may contain software bugs and  *
  13.  * exhibit inconsistencies.                                                  *
  14.  *                                                                           *
  15.  * Please send bug reports to polyview@ncsa.uiuc.edu.                        *
  16.  *                                                                           *
  17.  * Copyright (c) 1992 The Board of Trustees of the University of Illinois.   *
  18.  *                                                                           *
  19.  * Permission to use, copy, and modify this software and its                 *
  20.  * documentation for educational, research, and non-profit purposes is       *
  21.  * hereby granted, provided that the above copyright notice, the original    *
  22.  * authors names, and this permission notice appear in all such copies.      *
  23.  * Any distribution of this software requires the explicit and written       *
  24.  * authorization of the authors.                                             *
  25.  *                                                                           *
  26.  * The University of Illinois makes no representations about the             *
  27.  * suitability of this software for any purpose.  It is provided "as is"     *
  28.  * without warranty of any kind.                                             *
  29.  *****************************************************************************/
  30.  
  31. /* $Id: pvmain.c,v 1.4 93/08/24 10:30:26 gbourhis Exp $ */
  32.  
  33. #ifdef RCSLOG
  34. $Log:    pvmain.c,v $
  35.  * Revision 1.4  93/08/24  10:30:26  gbourhis
  36.  * replace version string 3.0 by 3.1.
  37.  * 
  38.  * Revision 1.3  92/09/30  18:36:36  marca
  39.  * Fixed FatalProblem message.
  40.  * 
  41.  * Revision 1.2  1992/09/19  03:07:58  marca
  42.  * Removed 'Beta' in window title.
  43.  *
  44.  * Revision 1.1  1992/09/18  10:55:26  marca
  45.  * Initial revision
  46.  *
  47. #endif
  48.  
  49. #include "pv.h"
  50. #include <signal.h>
  51.  
  52. #include <net.h>
  53.  
  54.  
  55. /* Global pointer to state. */
  56. state_t    *gstate;
  57.  
  58.  
  59. /* ------------------------------ initialize ------------------------------ */
  60. static char *script_name = NULL;
  61. static char *transcript_name = NULL;
  62.  
  63. static char *dtmin_port = NULL;
  64. static char *dtmout_port = NULL;
  65.  
  66. static int no_sigcatcher = 0;
  67. static int no_core = 0;
  68.  
  69. /* Skip past a single argument. */
  70. #define ArgInc { argv++; argc--; }
  71.  
  72. static int initialize(state_t *state, int argc, char **argv)
  73. {
  74.   while (--argc)
  75.     {
  76.       ++argv;
  77.  
  78.       if (strncmp ("-i", argv[0], 2) == 0)
  79.         {
  80.           if (argc == 1)
  81.             {
  82.               fprintf (stderr, "ERROR: must specify filename with -i flag.\n");
  83.               fflush (stderr);
  84.               return ST_ERROR;
  85.               /* NOTREACHED */
  86.             }
  87.           script_name = argv[1];
  88.           ArgInc;
  89.         }
  90.       else if (strncmp ("-o", argv[0], 2) == 0)
  91.         {
  92.           if (argc == 1)
  93.             {
  94.               fprintf (stderr, "ERROR: must specify filename with -o flag.\n");
  95.               fflush (stderr);
  96.               return ST_ERROR;
  97.               /* NOTREACHED */
  98.             }
  99.           transcript_name = argv[1];
  100.           ArgInc;
  101.         }
  102.       else if (strcmp ("-DTMIN", argv[0]) == 0 ||
  103.                strcmp ("-dtmin", argv[0]) == 0)
  104.         {
  105.           if (argc == 1)
  106.             {
  107.               fprintf 
  108.                 (stderr, "ERROR: must specify port ID with -DTMIN flag.\n");
  109.               fflush (stderr);
  110.               return ST_ERROR;
  111.               /* NOTREACHED */
  112.             }
  113.           dtmin_port = argv[1];
  114.           ArgInc;
  115.         }
  116.       else if (strcmp ("-DTMOUT", argv[0]) == 0 ||
  117.                strcmp ("-dtmout", argv[0]) == 0)
  118.         {
  119.           if (argc == 1)
  120.             {
  121.               fprintf 
  122.                 (stderr, "ERROR: must specify port ID with -DTMOUT flag.\n");
  123.               fflush (stderr);
  124.               return ST_ERROR;
  125.               /* NOTREACHED */
  126.             }
  127.           dtmout_port = argv[1];
  128.           ArgInc;
  129.         }
  130. #ifdef __sgi
  131.       else if (strcmp ("-dmalloc", argv[0]) == 0)
  132.         {
  133.           /* Just switch on debugging malloc. */
  134.           fprintf (stderr, "Enabling debugging malloc.\n");
  135.           mallopt (M_DEBUG, 1);
  136.         }
  137. #endif
  138.       else if (strcmp ("-nosigcatcher", argv[0]) == 0)
  139.         no_sigcatcher = 1;
  140.       else if (strcmp ("-nocore", argv[0]) == 0)
  141.         no_core = 1;
  142.       else if (strncmp ("-h", argv[0], 2) == 0 ||
  143.                strncmp ("-u", argv[0], 2) == 0)
  144.         {
  145.           /* Help. */
  146.           fprintf (stdout, 
  147.                    "***************************************************\n");
  148.           fprintf (stdout, 
  149.                    "* NCSA Polyview 3.1                               *\n");
  150.           fprintf (stdout, 
  151.                    "* National Center for Supercomputing Applications *\n");
  152.           fprintf (stdout,
  153.                    "* University of Illinois at Urbana-Champaign      *\n");
  154.           fprintf (stdout, 
  155.                    "* Questions?  Contact polyview@ncsa.uiuc.edu      *\n");
  156.           fprintf (stdout, 
  157.                    "*                                                 *\n");
  158.           fprintf (stdout, 
  159.                    "* Command line options:                           *\n");
  160.           fprintf (stdout,
  161.                    "*   -i <filename>  : Specify input script name.   *\n");
  162.           fprintf (stdout,
  163.                    "*   -o <filename>  : Specify output script name.  *\n");
  164.           fprintf (stdout,
  165.                    "*   -DTMOUT <port> : Establish DTM output port.   *\n");
  166.           fprintf (stdout,
  167.                    "*   -DTMIN <port>  : Establish DTM input port.    *\n");
  168.           fprintf (stdout, 
  169.                    "***************************************************\n");
  170.           fflush (stdout);
  171.           return ST_ERROR;
  172.           /* NOTREACHED */
  173.         }
  174.     }
  175.  
  176.   /* Initialize data subsystem. */
  177.   assert (init_data (state) == ST_OKAY);
  178.   
  179.   return ST_OKAY;
  180. }
  181.  
  182.  
  183. static int do_scripts (state_t *state)
  184. {
  185.   static FILE *init_fp;
  186.   static char *home_dir;
  187.   
  188.   /* If the transcript filename was specified, attempt to open it. */
  189.   if (transcript_name != NULL)
  190.     if ((state->transcript_fp = fopen(transcript_name, "w")) == NULL )
  191.       {
  192.         fprintf(stderr, "ERROR: Couldn't open output file '%s'.\n",
  193.                 transcript_name);
  194.         fflush (stderr);
  195.         return ST_ERROR;
  196.       }
  197.   
  198.   /* If the ".polyview" initialization file is present, open it and */
  199.   /* read it. */
  200.   init_fp = fopen (".polyview", "r");
  201.   if (init_fp != (FILE *)NULL)
  202.     {
  203.       stprintf (state, "Reading './.polyview' script.");
  204.       load_script(state, init_fp);
  205.       fclose(init_fp);
  206.     }
  207.   else
  208.     {
  209.       /* NEW: Look for ~/.polyview */
  210.       home_dir = 
  211.         strcpy ((char *)PVMALLOC (sizeof(char) * 256), getenv("HOME"));
  212.       init_fp = fopen (strcat (home_dir, "/.polyview"), "r");
  213.       if (init_fp != (FILE *)NULL)
  214.         {
  215.           stprintf (state, "Reading '$HOME/.polyview' script.\n");
  216.           load_script(state, init_fp);
  217.           fclose(init_fp);
  218.         }
  219.       PVFREE (home_dir);
  220.     }
  221.   
  222.   /* If the script filename was specified, attempt to open it. */
  223.   if (script_name != NULL)
  224.     if ((state->script_fp = fopen(script_name, "r")) == NULL)
  225.       {
  226.         stprintf (state, "ERROR: Couldn't open input file '%s'.\n",
  227.                  script_name);
  228.         return ST_ERROR;
  229.       }
  230.     else
  231.       {
  232.         stprintf (state, "Reading '%s' script.\n", script_name);
  233.         load_script(state, state->script_fp);
  234.         fclose(state->script_fp);
  235.       }
  236.  
  237.   return ST_OKAY;
  238. }
  239.  
  240.  
  241. /* --------------------------------- main --------------------------------- */
  242.  
  243. /* ----------------------------- X Resources ------------------------------ */
  244. /* We assume that we parse options first, use what we want, then pass
  245.    to Xt routines.  Thus, -i is explicitly disabled for Xt here. */
  246. static XrmOptionDescRec options[] = {
  247.   {"-fn",  "*fontList",         XrmoptionSepArg, NULL},
  248.   {"-ft",  "*XmText*fontList",  XrmoptionSepArg, NULL},
  249.   {"-fm",  "*menubar*fontList", XrmoptionSepArg, NULL},
  250.   /* Turn off the iconify flag. */
  251.   {"-i",   "*foobar",           XrmoptionSepArg, NULL},
  252. };
  253.  
  254. static String fallback_resources[] = {
  255.   "*background: light grey",
  256.   "*foreground: black",
  257.  
  258. #ifdef _IBMR2
  259.   "*XmCommand*troughColor: #7d9ec0",
  260.   "*scrolledtextSW*troughColor: #7d9ec0",
  261.   "*XmScale*troughColor: #7d9ec0",
  262.   "*fsb*troughColor: #7d9ec0",
  263.  
  264.   "*menubar*background: #7d9ec0",
  265. #endif
  266.  
  267. #ifdef __sgi
  268.   "*XmCommand*troughColor: SGILightBlue",
  269.   "*scrolledtextSW*troughColor: SGILightBlue",
  270.   "*XmScale*troughColor: SGILightBlue",
  271.   "*fsb*troughColor: SGILightBlue",
  272.  
  273.   "*menubar*background: SGILightBlue",
  274. #endif
  275.  
  276.   "*menubar*foreground: black",
  277.  
  278.   "*question*background: light grey",
  279.   "*question*foreground: black",
  280.  
  281.   "*helpdialog*background: light grey",
  282.   "*helpdialog*foreground: black",
  283.  
  284.   "*fsb*XmText*width: 420",                              
  285.  
  286.   "*highlightThickness: 2",
  287.   "*XmLabelGadget*highlightThickness: 0",
  288.   "*keyboardFocusPolicy: pointer",
  289.   "*highlightOnEnter: True",
  290.  
  291.   "*fontList: -*-helvetica-medium-r-normal-*-14*iso8859-1",
  292.   "*XmText*fontList: -*-lucidatypewriter-medium-r-normal-*-14*iso8859-1",
  293.   "*menubar*fontList: -*-helvetica-bold-o-normal-*-14*iso8859-1",
  294.  
  295.   /* This doesn't work.  Dunno why not. */
  296.   "*infozoid*XmLabel*fontList: *times*62*",
  297.  
  298.   "*fillOnSelect: True",                              
  299.   "*selectColor: #ffff00",                                                    
  300.  
  301.   "*cascadebutton*marginWidth: 8",                             
  302.  
  303.   "*title: NCSA Polyview 3.1",
  304.  
  305.   NULL,
  306. };
  307.  
  308.  
  309. static XmxCallback (GUItimeoutThree)
  310. {
  311.   char line[MAXLINELEN];
  312.  
  313.   /* Start processing actions. */
  314.   gstate->no_actions = FALSE;
  315.  
  316.   /* Open DTM input port if flag is specified. */
  317.   if (dtmin_port != NULL)
  318.     {
  319.       sprintf (line, "dtm in %s\0", dtmin_port);
  320.       parse_line (gstate, line, FALSE);
  321.     }
  322.  
  323.   /* Open DTM output port if flag is specified. */
  324.   if (dtmout_port != NULL)
  325.     {
  326.       sprintf (line, "dtm out %s\0", dtmout_port);
  327.       parse_line (gstate, line, FALSE);
  328.     }
  329.  
  330.   /* Load startup scripts. */
  331.   do_scripts (gstate);
  332.  
  333. #ifdef DMF
  334.   parse_line (gstate, "window open polyview DMF", TRUE);
  335.   parse_line (gstate, "palette use rgb", TRUE);
  336.   parse_line (gstate, "draw outlined", TRUE);
  337. #endif
  338.  
  339.   return;
  340. }
  341.  
  342. /* ------------------------------------------------------------------------ */
  343. /* ---------------------------- SIGNAL HANDLER ---------------------------- */
  344. /* ------------------------------------------------------------------------ */
  345.  
  346. static void RealFatal (void)
  347. {
  348.   signal(SIGBUS,0);
  349.   signal(SIGSEGV,0);
  350.   signal(SIGILL,0);
  351.   if (!no_core)
  352.     abort();
  353.   else
  354.     exit(0);
  355. }
  356.  
  357. static void FatalProblem(int sig, int code, struct sigcontext *scp,
  358.                          char *addr)
  359. {
  360.   fprintf(stderr,"\n\nCongratulations, you have found a bug in\n");
  361.   fprintf(stderr,"NCSA Polyview 3.1.\n\n");
  362.   fprintf(stderr,"If a core file was generated in your directory,\n");
  363.   fprintf(stderr,"please run 'dbx polyview' and then type:\n");
  364.   fprintf(stderr,"  dbx> where\n");
  365.   fprintf(stderr,"and send the results to polyview@ncsa.uiuc.edu.\n\n");
  366.   fprintf(stderr,"...exiting Polyview now.\n\n");
  367.  
  368.   if (gstate->transcript_fp)
  369.     fflush (gstate->transcript_fp);
  370.  
  371.   if (COMdtm_out_active_p (gstate))
  372.     {
  373.       /* Disconnect gracefully. */
  374.       if (NetSendDisconnect (NULL, RealFatal, RealFatal))
  375.         goto done;
  376.       while (1)
  377.         NetTryResend ();
  378.     }
  379.  
  380.  done:
  381.   RealFatal ();
  382.   /* NOTREACHED */
  383. }
  384.  
  385.  
  386. /* ------------------------------------------------------------------------ */
  387. /* --------------------------------- MAIN --------------------------------- */
  388. /* ------------------------------------------------------------------------ */
  389.  
  390. main (int argc, char **argv)
  391. {
  392.   /* State struct itself. */
  393.   state_t state;
  394.  
  395.   /* Global pointer to state struct. */
  396.   gstate = &state;
  397.  
  398.   /* Don't start executing actions until we say so. */
  399.   gstate->no_actions = TRUE;
  400.  
  401.   /* Parse command-line args and initialize data
  402.      before opening any windows. */
  403.   if (initialize (&state, argc, argv) != ST_OKAY)
  404.     exit_polyview ();
  405.  
  406.   /* Redirect signals to our own signal catcher. */
  407.   if (!no_sigcatcher)
  408.     {
  409.       signal(SIGBUS, FatalProblem);
  410.       signal(SIGSEGV, FatalProblem);
  411.       signal(SIGILL, FatalProblem);
  412.     }
  413.  
  414.   /* Set up Motif and go into XtAppMainLoop. */
  415.  
  416.   /* Initialize Xmx library. */
  417.   XmxStartup ();
  418.  
  419.   /* Connect to Xt. */
  420.   gstate->base = XtAppInitialize 
  421.     (&(gstate->app_context), "Polyview", options, XtNumber(options),
  422.      &argc, argv, fallback_resources, Xmx_wargs, Xmx_n);
  423. #ifdef TRANSLATIONS
  424.   XtAppAddActions 
  425.     (gstate->app_context, pviewActionsTable, XtNumber (pviewActionsTable));
  426.   pviewTransTable = XtParseTranslationTable (pviewTranslations);
  427. #endif
  428.  
  429.   /* Having filled in base and app_context fields, send gstate
  430.      to post_status to get the status window up. */
  431.   post_status (gstate);
  432.  
  433.   /* Realize the status window. */
  434.   XtRealizeWidget (gstate->base);
  435.  
  436.   /* Add timeouts for controlling global action. */
  437.   /* Everything's in timeout two for the moment. */
  438. #if 0
  439.   XtAppAddTimeOut (gstate->app_context, 50, GUItimeoutOne, True);
  440. #endif
  441.   XtAppAddTimeOut (gstate->app_context, 50, GUItimeoutTwo, True);
  442.   
  443. #ifdef DO_AUDIO
  444.   /* Sound. */
  445.   gstate->can_use_sound = InitSound ();
  446. #endif
  447.  
  448.   /* Initial timeout for reading scripts and implementing results
  449.      from command-line args. */
  450.   XtAppAddTimeOut (gstate->app_context, 100, GUItimeoutThree, True);
  451.  
  452.   /* Process events. */
  453.   XtAppMainLoop (gstate->app_context);
  454.   
  455.   /* NOTREACHED */
  456. }
  457.  
  458. /* ---------------------------- exit_polyview ----------------------------- */
  459.  
  460. static void RealExit (void)
  461. {
  462.   exit (0);
  463. }
  464.  
  465.  
  466. void exit_polyview (void)
  467. {
  468.   if (gstate->transcript_fp)
  469.     fflush (gstate->transcript_fp);
  470.  
  471.   if (COMdtm_out_active_p (gstate))
  472.     {
  473.       /* Disconnect gracefully. */
  474.       if (NetSendDisconnect (NULL, RealExit, RealExit))
  475.         RealExit ();
  476.       while (1) 
  477.         NetTryResend ();
  478.     }
  479.  
  480.   RealExit ();
  481. }
  482.  
  483. /* -------------------------- coredump_polyview --------------------------- */
  484. void coredump_polyview (void)
  485. {
  486.   if (gstate->transcript_fp)
  487.     fflush (gstate->transcript_fp);
  488.  
  489.   abort ();
  490.   /* NOTREACHED */
  491. }
  492.